package morenoapp.model.data;

import java.io.File;
import java.util.Collection;
import java.util.List;
import morenoapp.model.MorenoModelException;
import morenoapp.model.enums.MorenoPollType;
import morenoapp.model.enums.MorenoModelStage;
import morenoapp.model.enums.MorenoRespondentsSortOrder;
import morenoapp.model.meta.CollectionContentType;
import morenoapp.model.meta.MethodRedirect;
import morenoapp.model.meta.MethodDelegate;
import morenoapp.model.meta.MethodGetter;
import morenoapp.model.meta.MethodSetter;
import morenoapp.model.meta.NoModelIsOK;
import morenoapp.model.meta.ValueIfNoModel;
import morenoapp.model.view2.MorenoView2Data;

/**
 *
 * @author dmitry.mamonov
 */
public interface MorenoModelData extends MorenoModelMetadataFace {
    //generated:begin
    public static final String PROPERTY_CONCLUSION = "conclusion";
    public static final String PROPERTY_CREATIONDATE = "creationDate";
    public static final String PROPERTY_DESCRIPTION = "description";
    public static final String PROPERTY_INQUIRERINTRO = "inquirerIntro";
    public static final String PROPERTY_LASTID = "lastId";
    public static final String PROPERTY_LASTSAVEDATE = "lastSaveDate";
    public static final String PROPERTY_POLLDATE = "pollDate";
    public static final String PROPERTY_POLLLIMIT = "pollLimit";
    public static final String PROPERTY_POLLTYPE = "pollType";
    public static final String PROPERTY_RESEARCHGROUP = "researchGroup";
    public static final String PROPERTY_RESEARCHNAME = "researchName";
    public static final String PROPERTY_RESEARCHTARGET = "researchTarget";
    public static final String PROPERTY_STAGE = "stage";
    public static final String PROPERTY_STOREURI = "storeURI";
    public static final String PROPERTY_SUPERVISORINFO = "supervisorInfo";
    public static final String PROPERTY_VERSION = "version";
    public static final String PROPERTY_VERSIONCOMAPTIBILITY = "versionComaptibility";
    public static final String PROPERTY_VIEWSLIST = "viewsList";
    public static final String PROPERTY_QUESTIONSLIST = "questionsList";
    public static final String PROPERTY_RESPONDENTSLIST = "respondentsList";
    //generated:end
    /**
     * Стекущее состояние модели - заполненност модели данными.
     * @return
     */
    @MethodGetter
    @ValueIfNoModel("MorenoModelStage.NO_MODEL")
    MorenoModelStage getStage();

    /**
     * Увеличивает общее количество ответов, для каждого из вопросов, на один.
     * @return
     */
    @MethodRedirect("return createQuestionImpl()")
    MorenoQuestionFace createQuestion();

    /**
     * Переместить вопрос на позицию вверх в списке.
     * @param _question
     */
    @MethodRedirect("return moveQuestionUpImpl(_value)")
    boolean moveQuestionUp(MorenoQuestionFace _question);

    /**
     * Переместить вопрос на позицию вниз в списке.
     * @param _question
     */
    @MethodRedirect("return moveQuestionDownImpl(_value)")
    boolean moveQuestionDown(MorenoQuestionFace _question);

    /**
     * Удаляет список вопросов.
     * @param quetions
     */
    @MethodRedirect("deleteQuestionsImpl(_value)")
    void deleteQuestions(Collection<MorenoQuestionFace> quetions);

    /**
     * Создает запись о участнике опроса.
     * @return
     */
    @MethodRedirect("return createRespondentImpl()")
    MorenoRespondentFace createRespondent();

    /**
     * Удаляет список респондентов.
     * @param respondents
     */
    @MethodRedirect("deleteRespondentsImpl(_value)")
    void deleteRespondents(Collection<MorenoRespondentFace> respondents);

    @MethodGetter
    @CollectionContentType(MorenoQuestionFace.class)
    @ValueIfNoModel("java.util.Collections.emptyList()")
    List<MorenoQuestionFace> getQuestionsList();

    @MethodGetter
    @CollectionContentType(MorenoRespondentFace.class)
    @ValueIfNoModel("java.util.Collections.emptyList()")
    List<MorenoRespondentFace> getRespondentsList();

    @MethodRedirect("loadModelImpl(_value)")
    @NoModelIsOK
    void loadModel(File Source) throws MorenoModelException;

    @MethodDelegate
    void saveModel(File target) throws MorenoModelException;

    /**
     * Упорядочивает список респондентов по фамилии.
     */
    @MethodRedirect("sortRespondentsImpl(_value)")
    void sortRespondents(MorenoRespondentsSortOrder order);

    /**
     * Выполнение групповой операции над моделью.
     * По окончании операции будет вызвано событие о полном изменении модели.
     * @param batchJob
     */
    @MethodRedirect("doBatchJobImpl(_value)")
    void doBatchJob(MorenoModelBatchJob batchJob);

    /**
     * Получить описание исследования.
     * @return
     */
    @MethodGetter
    @ValueIfNoModel("\"\"")
    String getDescription();

    /**
     * Установить новое описание исследование.
     * @param name
     */
    @MethodSetter
    void setDescription(String description);

    /**
     * Получить информацию об исследователе.
     */
    @MethodGetter
    @ValueIfNoModel("\"\"")
    String getSupervisorInfo();

    /**
     * Установить информацию об исследователе.
     */
    @MethodSetter
    void setSupervisorInfo(String supervisorInfo);

    /**
     * Получить дату проведения опроса.
     * @return
     */
    @MethodGetter
    @ValueIfNoModel("\"\"")
    String getPollDate();

    /**
     * Установить дату проведения опроса.
     */
    @MethodSetter
    void setPollDate(String pollDate);

    /**
     * Получить тип опоса.
     * @return
     */
    @MethodGetter
    @ValueIfNoModel("MorenoPollType.NonParametricPoll")
    MorenoPollType getPollType();

    /**
     * Установить тип опроса.
     */
    @MethodSetter
    void setPollType(MorenoPollType pollType);

    /**
     * Очистить всю модель.
     */
    @MethodGetter
    @ValueIfNoModel("0")
    int getPollLimit();

    /**
     * Установить максимальное количество позиций в ответе
     * для типа опроса с ограниченным количеством позиций в ответе.
     * @param posistionCount
     */
    @MethodSetter
    void setPollLimit(int posistionCount);

    /**
     * Получить заключение по исследованию.
     * @return
     */
    @MethodGetter
    @ValueIfNoModel("\"\"")
    String getConclusion();

    /**
     * Установить заключение по исследованию.
     * @param conclusion
     */
    @MethodSetter
    void setConclusion(String conclusion);

    /**
     * Получить конфигурацию социограммы.
     * @return
     */
    @MethodGetter
    @ValueIfNoModel("Collections.emptyList()")
    public List<MorenoView2Data> getViewsList();

    /**
     * Название исследования.
     * @return
     */
    @MethodGetter
    @ValueIfNoModel("\"\"")
    String getResearchName();

    @MethodSetter
    void setResearchName(String _value);

    /**
     * Цель исследования.
     * @return
     */
    @MethodGetter
    @ValueIfNoModel("\"\"")
    String getResearchTarget();

    @MethodSetter
    void setResearchTarget(String _value);

    /**
     * Исследуемая группа.
     * @return
     */
    @MethodGetter
    @ValueIfNoModel("\"\"")
    String getResearchGroup();

    @MethodSetter
    void setResearchGroup(String _value);

    /**
     * Вводное слово к опросу.
     * @return
     */
    @MethodGetter
    @ValueIfNoModel("\"\"")
    public String getInquirerIntro();

    @MethodSetter
    void setInquirerIntro(String _value);
}
